#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

#define N 5

#define TASK_NUM 10




int main()
{
	pid_t id = fork();
	if(id < 0)
	{
		printf("进程创建失败\n");
	}
	else if(id == 0)
	{
		int cnt = 5;
		while(cnt--)
		{
			printf("子进程正在运行，pid = %d,ppid = %d,cnt = %d\n",getpid(),getppid(),cnt);
			sleep(1);
		}
		exit(0);
	}
	else
	{
		//父进程等待子进程
		int status = 0;
		while(1)
		{
			pid_t ret = waitpid(id,&status,WNOHANG);

			if(ret == id)
			{
				printf("等待成功，ret = %d\n",ret);

				if(WIFEXITED(status))
				{
					printf("子进程正常退出，退出码：%d\n",WEXITSTATUS(status));
				}
				else
				{
					printf("子进程异常退出，退出信号：%d\n",status & 0x7F);
				}
				break;
			}
			
			if(ret == 0)
			{
				printf("我是父进程，子进程还没有退出，我还可以做其他事\n");
				sleep(1);
			}

			if(ret == -1)
			{
				printf("等待失败\n");
				break;
			}
		}
		
	}
	sleep(5);
	return 0;
}

//void child()
//{
//	int cnt = 5;
//	while(cnt)
//	{
//		printf("一个子进程正在运行，pid = %d,ppid = %d,cnt = %d\n",getpid(),getppid(),cnt);
//		sleep(1);
//		cnt--;
//	}
//}
//
//int main()
//{
//	pid_t id = fork();
//	if(id < 0)
//	{
//		printf("进程创建失败\n");
//	}
//	else if(id == 0)
//	{
//		int cnt = 5;
//		while(cnt--)
//		{
//			printf("子进程正在运行，pid = %d,ppid = %d,cnt = %d\n",getpid(),getppid(),cnt);
//			sleep(1);
//		}
//		exit(0);
//	}
//	else
//	{
//		int cnt = 10;
//		while(cnt--)
//		{
//			printf("父进程正在运行，pid = %d,ppid = %d\n",getpid(),getppid());
//			sleep(1);
//		}
//		//父进程等待子进程
//		int status = 0;
//		pid_t ret = waitpid(id,&status,0);
//		if(ret == id)
//		{
//			printf("等待成功，ret = %d\n",ret);
//
//			if(WIFEXITED(status))
//			{
//				printf("子进程正常退出，退出码：%d\n",WEXITSTATUS(status));
//			}
//			else
//			{
//				printf("子进程异常退出，退出信号：%d\n",status & 0x7F);
//			}
//		}
//
//		if(ret == -1)
//		{
//			printf("等待失败\n");
//		}
//		
//	}
//	sleep(5);
//	return 0;
//}

//多个子进程的创建和父进程wait等待
//void child()
//{
//	int cnt = 5;
//	while(cnt--)
//	{
//		printf("一个子进程正在运行，pid = %d,ppid = %d,cnt = %d\n",getpid(),getppid(),cnt);
//		sleep(1);
//	}
//}
//
//int main()
//{
//	int i = 0;
//	for(;i<N;i++)
//	{
//		pid_t id = fork();
//		if(id == 0)
//		{
//			child();
//			exit(0);
//		}
//		printf("创建好了%d个子进程\n",i+1);
//	}
//	sleep(10);
//	int j = 0;
//	for(;j<N;j++)
//	{
//		pid_t id = wait(NULL);
//		printf("等待成功%d\n",id);
//		sleep(1);
//	}
//	sleep(5);
//	return 0;
//}
//int main()
//{
//	//单进程的创建与父进程等待
//	pid_t id = fork();
//	if(id < 0)
//	{
//		printf("进程创建失败\n");
//	}
//	else if(id == 0)
//	{
//		int cnt = 5;
//		while(cnt--)
//		{
//			printf("子进程正在运行,pid = %d,ppid = %d,cnt = %d\n",getpid(),getppid(),cnt);
//			sleep(1);
//		}
//	}
//	else 
//	{
//		int cnt = 10;
//		while(cnt--)
//		{	
//			printf("父进程正在运行,pid = %d,ppid = %d\n",getpid(),getppid());
//			sleep(1);
//		}
//		pid_t ret = wait(NULL);
//		if(ret == id)
//		{
//			printf("等待成功，ret = %d\n",ret);
//		}
//		sleep(5);
//	}
//	return 0;
//}
